android使用AES

您所在的位置:网站首页 android aes加密 android使用AES

android使用AES

2023-08-26 20:52| 来源: 网络整理| 查看: 265

需要第三方jar包:bcprov.jar:百度云下载地址

 1.方法介绍 

 分别是加解密的方法。主要参数是三个:

  1.需要加密的字符串

  2.加密钥匙。经测试,只能16位或者32位。

  3.IV。即偏移量。只能16位。

2.工具类缺陷

  1.没有做容错处理,对加密钥匙,不是16位或者32位,应该以“0” 填充或删除。

3.修改如下

  1.编码形式使用:BASE64。 也可自己替换成HEX编码,该类含有HEX的工具类。

4.工具类如下 import java.security.Security; import java.util.Locale; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.util.encoders.Base64; /** * AES加密解密字符串工具类 * 概述:AES高级加密标准,是对称密钥加密中最流行的算法之一; * 工作模式包括:ECB、CBC、CTR、OFB、CFB; * 使用范围:该工具类仅支持CBC模式下的: * 填充:PKCS7PADDING * 数据块:128位 * 密码(key):32字节长度(例如:12345678901234567890123456789012) * 偏移量(iv):16字节长度(例如:1234567890123456) * 输出:hex * 字符集:UTF-8 * 使用方式:String encrypt = AESCBCUtil.encrypt("wy"); * String decrypt = AESCBCUtil.decrypt(encrypt); * 验证方式:http://tool.chacuo.net/cryptaes(在线AES加密解密) */ public class AESCBCUtil { //密码 private static final String key = "12345678901234567890123456789012"; //iv偏移量 private static final String iv = "1234567890123456"; /** * 加密:对字符串进行加密,并返回十六进制字符串(hex) * * @param encryptStr 需要加密的字符串 * @return 加密后的十六进制字符串(hex) */ public static String encrypt(String encryptStr, String key, String iv) { try { IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8")); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); /** * 这个地方调用BouncyCastleProvider *让java支持PKCS7Padding */ Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec); byte[] encrypted = cipher.doFinal(encryptStr.getBytes()); byte[] encode = Base64.encode(encrypted); String string = new String(encode); return string; // return byte2HexStr(encrypted); } catch (Exception ex) { ex.printStackTrace(); } return null; } /** * 解密:对加密后的十六进制字符串(hex)进行解密,并返回字符串 * * @param encryptedStr 需要解密的,加密后的十六进制字符串 * @return 解密后的字符串 */ public static String decrypt(String encryptedStr, String key, String iv) { try { IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8")); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING"); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec); byte[] decode = Base64.decode(encryptedStr); // byte[] bytes = hexStr2Bytes(encryptedStr); byte[] original = cipher.doFinal(decode); return new String(original); } catch (Exception ex) { ex.printStackTrace(); } return null; } /** * 十六进制字符串转换为byte[] * * @param hexStr 需要转换为byte[]的字符串 * @return 转换后的byte[] */ public static byte[] hexStr2Bytes(String hexStr) { /*对输入值进行规范化整理*/ hexStr = hexStr.trim().replace(" ", "").toUpperCase(Locale.US); //处理值初始化 int m = 0, n = 0; int iLen = hexStr.length() / 2; //计算长度 byte[] ret = new byte[iLen]; //分配存储空间 for (int i = 0; i < iLen; i++) { m = i * 2 + 1; n = m + 1; ret[i] = (byte) (Integer.decode("0x" + hexStr.substring(i * 2, m) + hexStr.substring(m, n)) & 0xFF); } return ret; } /** * byte[]转换为十六进制字符串 * * @param bytes 需要转换为字符串的byte[] * @return 转换后的十六进制字符串 */ public static String byte2HexStr(byte[] bytes) { String hs = ""; String stmp = ""; for (int n = 0; n < bytes.length; n++) { stmp = (Integer.toHexString(bytes[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; } return hs; } } 5.问题

一、java.security.InvalidKeyException Illegal key size

环境JDK1.8 1、到以下网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8得到包jce_policy-8.zip

2、解决jce_policy-8.zip将里面的local_policy.jar和US_export_policy.jar复制并覆盖%JAVA_HOME%/jre/lib/security下的local_policy.jar和US_export_policy.jar



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3